package Classes;



import Classes.Estabelecimento;
import java.util.*;

public class RecomendacaoGlobal{
	
	private ArrayList<Integer> arrayInt;
	private Map<String,Integer> map;
	private ArrayList<Estabelecimento> arrayordenado;
	private ArrayList<Estabelecimento> estabelecimento;
	
	public RecomendacaoGlobal(){
		
		map = new HashMap<String, Integer>();
		arrayordenado = new ArrayList<Estabelecimento>();
		arrayInt = new ArrayList<Integer>();
		estabelecimento = new ArrayList<Estabelecimento>();
	}
	
	public ArrayList<Estabelecimento> Sugeri(RepositorioDeUsuarios usuarios,int numero) throws Exception{
		if(usuarios.getUsuarios().size()==0){
			throw new Exception("Repositorio de usuarios vazio!");
		}
		
		for(Opniao opi : usuarios.getUsuarioPorIndice(1).getPreferencias()){
			estabelecimento.add(opi.getEstabelecimento());
		}
		
		if(estabelecimento.size()<numero){
			throw new Exception("Numero maior que o numero de restaurantes a sugerir");
		}
		
		int nota;
		map.clear();
		arrayordenado.clear();
		arrayInt.clear();
		
		Iterator<Usuario> it = usuarios.getUsuarios().iterator();	
		while(it.hasNext()){
			for(Opniao opniao : it.next().getPreferencias()){
				if(!(map.containsKey(opniao.getNomeEstabelecimento()))){
					map.put(opniao.getNomeEstabelecimento(), opniao.getNota());					
				}else{
					
					nota = map.get(opniao.getNomeEstabelecimento());
					map.put(opniao.getNomeEstabelecimento(), (opniao.getNota()+nota));
				}
			}
		}
		
		for(Integer valor : map.values()){
			arrayInt.add(valor);
		}
		
		Collections.sort(arrayInt);
		Collections.reverse(arrayInt);
                
		for(int i= 0;i<arrayInt.size();i++){
			for(String string : map.keySet()){
                            for(Estabelecimento e : estabelecimento){
				if((e.getNome().equals(string))&&(arrayInt.get(i)==map.get(string))&&!(arrayordenado.contains(e))&&(arrayordenado.size()<numero)){
					arrayordenado.add(e);
				}
                            }
			}
		}
		return arrayordenado;
	}
		
	

}
